/**
 * Software License, Version 1.0
 * 
 * Copyright 2008 The Trustees of Indiana University.  All rights reserved.
 * 
 *
 *Redistribution and use in source and binary forms, with or without 
 *modification, are permitted provided that the following conditions are met:
 *
 *1) All redistributions of source code must retain the above copyright notice,
 * the list of authors in the original source code, this list of conditions and
 * the disclaimer listed in this license;
 *2) All redistributions in binary form must reproduce the above copyright 
 * notice, this list of conditions and the disclaimer listed in this license in
 * the documentation and/or other materials provided with the distribution;
 *3) Any documentation included with all redistributions must include the 
 * following acknowledgment:
 *
 *"This product includes software developed by the Community Grids Lab. For 
 * further information contact the Community Grids Lab at 
 * http://communitygrids.iu.edu/."
 *
 * Alternatively, this acknowledgment may appear in the software itself, and 
 * wherever such third-party acknowledgments normally appear.
 * 
 *4) The name Indiana University or Community Grids Lab or Granules, 
 * shall not be used to endorse or promote products derived from this software 
 * without prior written permission from Indiana University.  For written 
 * permission, please contact the Advanced Research and Technology Institute 
 * ("ARTI") at 351 West 10th Street, Indianapolis, Indiana 46202.
 *5) Products derived from this software may not be called Granules, 
 * nor may Indiana University or Community Grids Lab or Granules appear
 * in their name, without prior written permission of ARTI.
 * 
 *
 * Indiana University provides no reassurances that the source code provided 
 * does not infringe the patent or any other intellectual property rights of 
 * any other entity.  Indiana University disclaims any liability to any 
 * recipient for claims brought by any other entity based on infringement of 
 * intellectual property rights or otherwise.  
 *
 * LICENSEE UNDERSTANDS THAT SOFTWARE IS PROVIDED "AS IS" FOR WHICH NO 
 * WARRANTIES AS TO CAPABILITIES OR ACCURACY ARE MADE. INDIANA UNIVERSITY GIVES
 * NO WARRANTIES AND MAKES NO REPRESENTATION THAT SOFTWARE IS FREE OF 
 * INFRINGEMENT OF THIRD PARTY PATENT, COPYRIGHT, OR OTHER PROPRIETARY RIGHTS. 
 * INDIANA UNIVERSITY MAKES NO WARRANTIES THAT SOFTWARE IS FREE FROM "BUGS", 
 * "VIRUSES", "TROJAN HORSES", "TRAP DOORS", "WORMS", OR OTHER HARMFUL CODE.  
 * LICENSEE ASSUMES THE ENTIRE RISK AS TO THE PERFORMANCE OF SOFTWARE AND/OR 
 * ASSOCIATED MATERIALS, AND TO THE PERFORMANCE AND VALIDITY OF INFORMATION 
 * GENERATED USING SOFTWARE.
 */
package cgl.granules.util;

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

/**
 * This is a utility class that allows one to execute native commands from Java.
 * There are capabilities within this class to print out the output streams of
 * the <code>Process</code> that executes this native code.
 * 
 * @author Shrideep Pallickara
 * 
 */
public class SystemCommand {
	// private static final SystemCommand instance = new SystemCommand();

	public SystemCommand() {

	}

	/**
	 * Retrieve the single-ton instance associated with this class.
	 * 
	 * @return
	 */
	// public static SystemCommand getInstance() {
	// return instance;
	// }
	/**
	 * This method executes a system command based on the specified parameter.
	 * The method is designed such that it returns ONLY after the command has
	 * completed execution. A return value of 0 indicates normal termination,
	 * while anything else will signify abnormal termination.
	 * 
	 * @param command
	 *            The specified system command
	 * @param envp
	 *            Array of strings, each element of which has environment
	 *            variable settings in the format <i>name</i>=<i>value</i>, or
	 *            <tt>null</tt> if the subprocess should inherit the environment
	 *            of the current process.
	 * 
	 * @param dir
	 *            The working directory of the subprocess, or <tt>null</tt> if
	 *            the subprocess should inherit the working directory of the
	 *            current process.
	 * @param printOutput
	 *            Prints the output of the execution of the command
	 * @return the exit value of the process. By convention, 0 indicates normal
	 *         termination
	 * @throws IOException
	 *             If an I/O error occurs
	 * @throws InterruptedException
	 *             if the current thread is interrupted by another thread while
	 *             it is waiting, then the wait is ended and an
	 *             <code>InterruptedException</code> is thrown.
	 */
	public int executeCommand(String command, String[] envp, File dir,
			boolean printOutput) throws IOException, InterruptedException {
		Runtime runtime = Runtime.getRuntime();

		if (printOutput) {
			//System.out.println("Executing ... " + command);
		}

		Process process = runtime.exec(command, envp, dir);

		if (printOutput) {
			InputStream is = process.getInputStream();
			InputStreamReader isr = new InputStreamReader(is);
			BufferedReader br = new BufferedReader(isr);

			String line = "";
			while ((line = br.readLine()) != null) {
			//	System.out.println(line);
			}
			br.close();
			isr.close();
			is.close();
			
		}

		int code = process.waitFor();
		if (printOutput) {
			//System.out.println("Finished executing command: " + command
			//		+ " exit code = (" + code + ")");
		}

		//process.destroy();

		return code;
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		SystemCommand command = new SystemCommand();
		String sysCommand = "ping 156.56.104.110";

		try {
			command.executeCommand(sysCommand, null, null, true);
		} catch (IOException e) {
			e.printStackTrace();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}

	}

}
